/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package org.quality4spl.fm.cvm;

import org.eclipse.emf.common.util.EList;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Feature</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getCardinality <em>Cardinality</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getParentModel <em>Parent Model</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getParentGroup <em>Parent Group</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getChildNodes <em>Child Nodes</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#isRemoved <em>Removed</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getReferenceFeature <em>Reference Feature</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getStartingLinks <em>Starting Links</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getEndingLinks <em>Ending Links</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getOutgoingLinks <em>Outgoing Links</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getIncomingLinks <em>Incoming Links</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getDeviationAttributeSet <em>Deviation Attribute Set</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getParameterType <em>Parameter Type</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getExtendedFeatures <em>Extended Features</em>}</li>
 *   <li>{@link org.quality4spl.fm.cvm.Feature#getExtendedBy <em>Extended By</em>}</li>
 * </ul>
 * </p>
 *
 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature()
 * @model annotation="http://www.eclipse.org/emf/2002/Ecore constraints='FeatureInheritance'"
 * @generated
 */
public interface Feature extends FeatureTreeNode, NamedElement {
	/**
	 * Returns the value of the '<em><b>Cardinality</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Cardinality</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Cardinality</em>' containment reference.
	 * @see #setCardinality(Cardinality)
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_Cardinality()
	 * @model containment="true"
	 * @generated
	 */
	Cardinality getCardinality();

	/**
	 * Sets the value of the '{@link org.quality4spl.fm.cvm.Feature#getCardinality <em>Cardinality</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Cardinality</em>' containment reference.
	 * @see #getCardinality()
	 * @generated
	 */
	void setCardinality(Cardinality value);

	/**
	 * Returns the value of the '<em><b>Parent Model</b></em>' container reference.
	 * It is bidirectional and its opposite is '{@link org.quality4spl.fm.cvm.FeatureModel#getRootFeatures <em>Root Features</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Parent Model</em>' container reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Parent Model</em>' container reference.
	 * @see #setParentModel(FeatureModel)
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_ParentModel()
	 * @see org.quality4spl.fm.cvm.FeatureModel#getRootFeatures
	 * @model opposite="rootFeatures" transient="false"
	 * @generated
	 */
	FeatureModel getParentModel();

	/**
	 * Sets the value of the '{@link org.quality4spl.fm.cvm.Feature#getParentModel <em>Parent Model</em>}' container reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Parent Model</em>' container reference.
	 * @see #getParentModel()
	 * @generated
	 */
	void setParentModel(FeatureModel value);

	/**
	 * Returns the value of the '<em><b>Parent Group</b></em>' container reference.
	 * It is bidirectional and its opposite is '{@link org.quality4spl.fm.cvm.FeatureGroup#getChildFeatures <em>Child Features</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Parent Group</em>' container reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Parent Group</em>' container reference.
	 * @see #setParentGroup(FeatureGroup)
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_ParentGroup()
	 * @see org.quality4spl.fm.cvm.FeatureGroup#getChildFeatures
	 * @model opposite="childFeatures" transient="false"
	 * @generated
	 */
	FeatureGroup getParentGroup();

	/**
	 * Sets the value of the '{@link org.quality4spl.fm.cvm.Feature#getParentGroup <em>Parent Group</em>}' container reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Parent Group</em>' container reference.
	 * @see #getParentGroup()
	 * @generated
	 */
	void setParentGroup(FeatureGroup value);

	/**
	 * Returns the value of the '<em><b>Child Nodes</b></em>' containment reference list.
	 * The list contents are of type {@link org.quality4spl.fm.cvm.FeatureTreeNode}.
	 * It is bidirectional and its opposite is '{@link org.quality4spl.fm.cvm.FeatureTreeNode#getParentFeature <em>Parent Feature</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Child Nodes</em>' containment reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Child Nodes</em>' containment reference list.
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_ChildNodes()
	 * @see org.quality4spl.fm.cvm.FeatureTreeNode#getParentFeature
	 * @model opposite="parentFeature" containment="true"
	 * @generated
	 */
	EList<FeatureTreeNode> getChildNodes();

	/**
	 * Returns the value of the '<em><b>Removed</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Removed</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Removed</em>' attribute.
	 * @see #setRemoved(boolean)
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_Removed()
	 * @model required="true"
	 * @generated
	 */
	boolean isRemoved();

	/**
	 * Sets the value of the '{@link org.quality4spl.fm.cvm.Feature#isRemoved <em>Removed</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Removed</em>' attribute.
	 * @see #isRemoved()
	 * @generated
	 */
	void setRemoved(boolean value);

	/**
	 * Returns the value of the '<em><b>Reference Feature</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Reference Feature</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Reference Feature</em>' reference.
	 * @see #setReferenceFeature(Feature)
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_ReferenceFeature()
	 * @model
	 * @generated
	 */
	Feature getReferenceFeature();

	/**
	 * Sets the value of the '{@link org.quality4spl.fm.cvm.Feature#getReferenceFeature <em>Reference Feature</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Reference Feature</em>' reference.
	 * @see #getReferenceFeature()
	 * @generated
	 */
	void setReferenceFeature(Feature value);

	/**
	 * Returns the value of the '<em><b>Starting Links</b></em>' reference list.
	 * The list contents are of type {@link org.quality4spl.fm.cvm.FeatureLink}.
	 * It is bidirectional and its opposite is '{@link org.quality4spl.fm.cvm.FeatureLink#getStart <em>Start</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Starting Links</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Starting Links</em>' reference list.
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_StartingLinks()
	 * @see org.quality4spl.fm.cvm.FeatureLink#getStart
	 * @model opposite="start"
	 * @generated
	 */
	EList<FeatureLink> getStartingLinks();

	/**
	 * Returns the value of the '<em><b>Ending Links</b></em>' reference list.
	 * The list contents are of type {@link org.quality4spl.fm.cvm.FeatureLink}.
	 * It is bidirectional and its opposite is '{@link org.quality4spl.fm.cvm.FeatureLink#getEnd <em>End</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Ending Links</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Ending Links</em>' reference list.
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_EndingLinks()
	 * @see org.quality4spl.fm.cvm.FeatureLink#getEnd
	 * @model opposite="end"
	 * @generated
	 */
	EList<FeatureLink> getEndingLinks();

	/**
	 * Returns the value of the '<em><b>Outgoing Links</b></em>' reference list.
	 * The list contents are of type {@link org.quality4spl.fm.cvm.FeatureLink}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Outgoing Links</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Outgoing Links</em>' reference list.
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_OutgoingLinks()
	 * @model transient="true" changeable="false" volatile="true" derived="true"
	 * @generated
	 */
	EList<FeatureLink> getOutgoingLinks();

	/**
	 * Returns the value of the '<em><b>Incoming Links</b></em>' reference list.
	 * The list contents are of type {@link org.quality4spl.fm.cvm.FeatureLink}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Incoming Links</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Incoming Links</em>' reference list.
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_IncomingLinks()
	 * @model transient="true" changeable="false" volatile="true" derived="true"
	 * @generated
	 */
	EList<FeatureLink> getIncomingLinks();

	/**
	 * Returns the value of the '<em><b>Deviation Attribute Set</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Deviation Attribute Set</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Deviation Attribute Set</em>' containment reference.
	 * @see #setDeviationAttributeSet(DeviationAttributeSet)
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_DeviationAttributeSet()
	 * @model containment="true"
	 * @generated
	 */
	DeviationAttributeSet getDeviationAttributeSet();

	/**
	 * Sets the value of the '{@link org.quality4spl.fm.cvm.Feature#getDeviationAttributeSet <em>Deviation Attribute Set</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Deviation Attribute Set</em>' containment reference.
	 * @see #getDeviationAttributeSet()
	 * @generated
	 */
	void setDeviationAttributeSet(DeviationAttributeSet value);

	/**
	 * Returns the value of the '<em><b>Parameter Type</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Parameter Type</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Parameter Type</em>' containment reference.
	 * @see #setParameterType(StringConstrainingType)
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_ParameterType()
	 * @model containment="true"
	 * @generated
	 */
	StringConstrainingType getParameterType();

	/**
	 * Sets the value of the '{@link org.quality4spl.fm.cvm.Feature#getParameterType <em>Parameter Type</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Parameter Type</em>' containment reference.
	 * @see #getParameterType()
	 * @generated
	 */
	void setParameterType(StringConstrainingType value);

	/**
	 * Returns the value of the '<em><b>Extended Features</b></em>' reference list.
	 * The list contents are of type {@link org.quality4spl.fm.cvm.Feature}.
	 * It is bidirectional and its opposite is '{@link org.quality4spl.fm.cvm.Feature#getExtendedBy <em>Extended By</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Extended Features</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Extended Features</em>' reference list.
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_ExtendedFeatures()
	 * @see org.quality4spl.fm.cvm.Feature#getExtendedBy
	 * @model opposite="extendedBy"
	 * @generated
	 */
	EList<Feature> getExtendedFeatures();

	/**
	 * Returns the value of the '<em><b>Extended By</b></em>' reference list.
	 * The list contents are of type {@link org.quality4spl.fm.cvm.Feature}.
	 * It is bidirectional and its opposite is '{@link org.quality4spl.fm.cvm.Feature#getExtendedFeatures <em>Extended Features</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Extended By</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Extended By</em>' reference list.
	 * @see org.quality4spl.fm.cvm.CvmPackage#getFeature_ExtendedBy()
	 * @see org.quality4spl.fm.cvm.Feature#getExtendedFeatures
	 * @model opposite="extendedFeatures"
	 * @generated
	 */
	EList<Feature> getExtendedBy();

} // Feature
